#include <iostream>
using std::cout;
using std::endl;
//实现一个简易的栈功能
//成员函数：1.类的内部声明定义
//2.内部声明、外部定义
//3.声明和实现分别放到不同的文件中
class Stack{
public:
    Stack(int capacity);
    bool empty();
    bool full();
    void push(int value);
    void pop();
    int top();
    ~Stack();

private:
    int * _data;
    int _capacity;
    int _top;//指针所指向的位置
             //每当插入一个元素，向上移动一位
};

Stack::Stack(int capacity)
:_data(new int[_capacity]())
,_capacity(capacity)
,_top(-1)
{
    cout << "Stack(int)" << endl;
}
bool Stack::empty(){
    return _top == -1;
}
bool Stack::full(){
    return _top == _capacity - 1;
}
//判断是否满，如果不满，则插入数据
//使用前置++，刚好第一个插入的元素下标是0
void Stack::push(int value){
    if(full()){
        cout << "the stack is full" << endl;
        return;
    }
    _data[++_top] = value;
}
//弹出最顶端的元素
//但是因为我们使用数组来实现的，其实可以设置一个游标位置
//让游标位置无法访问到后面的数据，也就相当于弹出的效果
void Stack::pop(){
    if(empty()){
        cout << "the stack is empty" << endl;
        return;
    }
    --_top;
}

int Stack::top(){
    return _data[_top];
}
Stack::~Stack(){
    if(_data){
        delete [] _data;
        _data = nullptr;
    }
}


void test(){
    Stack st(10);
    for(int i = 0; i < 15; ++i){
        st.push(i);
    }

    for(int i = 0; i < 10; ++i){
        //查看最顶端的元素
        cout << st.top() << endl;
        //弹出栈顶元素
        st.pop();
    }
}

int main()
{
    test();
    return 0;
}

